import fs from 'fs';
import Koa from 'koa';
import Router from '@koa/router';
import cors from '@koa/cors';
import staticServer from 'koa-static';
import { koaBody } from 'koa-body';
import koaRange from "koa-range";
//import staticCache from 'koa-static-cache';

import compress from 'koa-compress';//gzip支持
import conditional from 'koa-conditional-get';//协商缓存支持
import etag from 'koa-etag';//协商缓存支持
import{auth}   from './auth.js';


class WebServer {
    constructor() {
        this.port = 80;
        this.app = null;
        this.router = null;
    }

    async Start(port, routerPath = './Services') {
        if (port != null) {
            this.port = port;
        }
        this.app = new Koa();
        this.router = new Router();
        //加载所有服务路由
        let fileList = fs.readdirSync(routerPath);
        for (const file of fileList) {
            try {
                let result = await import(`${routerPath}/${file}`);
                this.router.use(result.router.routes());
            } catch (err) {
                console.error(`注册路由失败,文件名:${file}`, err);
            }
        }
        //启动web服务
        this.app.use(async (ctx, next) => { //错误捕获
            try {
                await next();
            } catch (error) {
                ctx.status = error.statusCode || error.status || 500;
                ctx.body = error.message;
                console.trace(error);
            }
        })
        this.router.all('/slb/check', async (ctx) => {
            ctx.body = 'ok';
        });
        this.app.use(cors());
        this.app.use(koaRange);
        // this.app.use(staticCache('/View', {
        //     maxAge: 60 * 60 * 24 * 30, // 设置缓存过期时间为30天
        //     buffer: true, // 开启缓存到内存的选项
        //     usePrecompiledGzip: true, // 使用预编译的 Gzip 文件（如果有）
        //     gzip: true, // 开启 Gzip 压缩
        //     dynamic: true, // 启用动态协商缓存
        //     extensions: ['.html', '.css', '.js'], // 设置需要进行协商缓存的文件扩展名
        //     // filter: (context) => { // 自定义过滤策略
        //     //   const isFilter = false;
        //     //   // 可以根据请求的路径或其他条件决定是否过滤某些文件
        //     //   // if (context.path === '/some-path') {
        //     //   //   return true; // 过滤该路径下的文件
        //     //   // }
        //     //   return isFilter;
        //     // },
        //   }));
        // 添加中间件，先执行协商缓存相关处理
        this.app.use(conditional());
        this.app.use(etag());
        this.app.use(compress());
        this.app.use(staticServer('./View'));
        this.app.use(koaBody({
            multipart: true, formidable: {
                maxFieldsSize: 100 * 1024 * 1024, // 最大文件大小为 100MB
                multipart: true,
                keepExtensions: true // 保持原始文件的扩展名
            }
        }));
        this.app.use(auth);
        this.app.use(this.router.routes());
        this.app.use(this.router.allowedMethods()); //ctx.status为空或者404的时候,丰富response对象的header头
        this.app.listen(this.port, () => {
            console.log(`web服务启动成功,端口:${this.port}`);
        });
    }
}

export default WebServer;
